#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

/**
 * mysem_init: 完成对指定信号灯的初始化
 * 参数：
 *     semid ：信号灯集的标识符
 *     semnum：信号类编号
 *     val   ：信号灯的初始值
 */

int mysem_init(int semid, int semnum, int val) {
    union semun {
        int val;
    };
    union semun mysem;
    mysem.val = val;
    if(semctl(semid, semnum, SETVAL, mysem) != 0) {
        perror("mysem_init 中 semctl 执行出错\n");
        return -1;
    }

    return 0;
}

/**
 * mysem_p：完成对指定信号灯的P操作
 * 参数：
 *      semid ：信号灯集的标识符
 *      semnum：信号灯编号
 */
int mysem_p(int semid, int semnum) {
    struct sembuf mysem;
    mysem.sem_num = semnum;
    mysem.sem_op = -1;
    mysem.sem_flg = 0;
    if(semop(semid, &mysem, 1) == -1) {
        perror("mysem_p 中 semop 执行出错\n");
        return -1;
    }

    return 0;
}

/**
 * mysem_v：完成对指定信号灯的V操作
 * 参数：
 *      semid ：信号灯集的标识符
 *      semnum：信号灯编号
 */
int mysem_v(int semid, int semnum) {
    struct sembuf mysem;
    mysem.sem_num = semnum;
    mysem.sem_op = 1;
    mysem.sem_flg = 0;

    if(semop(semid, &mysem, 1) == -1) {
        perror("mysem_v 中 semop 执行出错\n");
        return -1;
    }

    return 0;
}

